package quarto.controller;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Klasse voor het valideren en executeren van commando's
 * @author Frank Borgonjen & Tim Smit
 */
public abstract class Command implements Runnable
{
    /** patroon voor het commando */
    private String regex;
    
    /** het meegegeven commando */
    private String command;
    
    /**
     * Maakt een nieuw commando aan met een patroon voor het commando
     * @param regex
     */
    public Command(String regex)
    {
        // patroon opslaan
        this.regex = regex;
    }
    
    /**
     * Controleert of een opgegeven commando-string uitgevoerd 
     * kan worden door dit commando
     * @param commando-string
     * @return bool uitvoerbaar
     */
    public boolean executable(String command)
    {
        // komt het commando overeen het patroon
        boolean res = command.matches(this.regex);
        if (res)
        {
            // commando opslaan voor later gebruik
            this.command = command;
        }
        return res;
    }
    
    /**
     * Geeft de parameters terug van dit commando
     * @return de parameters
     */
    public ArrayList<String> getParameters()
    {
        // initialisatie
        ArrayList<String> tmpResult = new ArrayList<String>();
        Scanner tmpScanner = new Scanner(this.command).useDelimiter(Protocol.SCANNER_DELIM);
        boolean first = true;
        String parameter;
        
        // zolang er nog volgende parameters zijn in het commando
        while (tmpScanner.hasNext())
        {
            parameter = tmpScanner.next();
            
            // eerste parameter niet opslaan,
            // dit namelijk de identificatie van het commando
            if (!first)
            {
                tmpResult.add(parameter);
            }
            
            first = false;
        }
        
        return tmpResult;
    }
    
    /**
     * Voer het commando uit
     */
    public abstract void run();
}

